/**
 * 实现curry
 */

// const { curry } = require('lodash')

// const getSum = (a, b, c) => a + b + c
// const curried = curry(getSum)

// console.log(curried(1, 2, 3))
// console.log(curried(1)(2)(3))

/**
 * 分析
 * curry接收一个函数，返回一个函数
 * 柯里化函数接收的参数数量与原函数需要的参数数量一致时会立即调用原函数
 * 柯里化函数接收的参数数量少于原函数需要的参数数量时，会返回一个新函数来接收剩余的参数
 */

const curry =  (func: (...args: any) => any) => {
  const curriedFn = (...args) => {
    // 当传入柯里化的参数数量小于原函数形参的数量时，递归调用curriedFn方法，直到总参数数量等于原函数形参数量
    if (args.length < func.length) {
      // [...args, ...rest] 组合所有传入的参数
      return (...rest) => curriedFn(...[...args, ...rest])
    }
    return func(...args)
  }
  return curriedFn
}

const getSum = (a: number, b: number, c: number) => a + b + c
const curried = curry(getSum)

console.log(curried(1, 2, 3))
console.log(curried(1)(2)(3))

export {}

